home *** CD-ROM | disk | FTP | other *** search
/ The CICA Windows Explosion! / The CICA Windows Explosion! - Disc 2.iso / programr / dpmigcc5.zip / RSX / SOURCE / FPU-EMU / FPU_EMU.H < prev    next >
C/C++ Source or Header  |  1994-05-27  |  6KB  |  177 lines

  1. /*---------------------------------------------------------------------------+
  2.  |  fpu_emu.h                                                                |
  3.  |                                                                           |
  4.  | Copyright (C) 1992,1993,1994                                              |
  5.  |                       W. Metzenthen, 22 Parker St, Ormond, Vic 3163,      |
  6.  |                       Australia.  E-mail   billm@vaxc.cc.monash.edu.au    |
  7.  |                                                                           |
  8.  +---------------------------------------------------------------------------*/
  9.  
  10.  
  11. #ifndef _FPU_EMU_H_
  12. #define _FPU_EMU_H_
  13.  
  14. /*
  15.  * Define DENORM_OPERAND to make the emulator detect denormals
  16.  * and use the denormal flag of the status word. Note: this only
  17.  * affects the flag and corresponding interrupt, the emulator
  18.  * will always generate denormals and operate upon them as required.
  19.  */
  20. #define DENORM_OPERAND
  21.  
  22. /*
  23.  * Define PECULIAR_486 to get a closer approximation to 80486 behaviour,
  24.  * rather than behaviour which appears to be cleaner.
  25.  * This is a matter of opinion: for all I know, the 80486 may simply
  26.  * be complying with the IEEE spec. Maybe one day I'll get to see the
  27.  * spec...
  28.  */
  29. #define PECULIAR_486
  30.  
  31. #ifdef __ASSEMBLER__
  32. #include "fpu_asm.h"
  33. #define    Const(x)    $##x
  34. #else
  35. #define    Const(x)    x
  36. #endif
  37.  
  38. #define EXP_BIAS    Const(0)
  39. #define EXP_OVER    Const(0x4000)    /* smallest invalid large exponent */
  40. #define    EXP_UNDER    Const(-0x3fff)   /* largest invalid small exponent */
  41. #define EXP_Infinity    EXP_OVER
  42. #define EXP_NaN         EXP_OVER
  43.  
  44. #define SIGN_POS    Const(0)
  45. #define SIGN_NEG    Const(1)
  46.  
  47. /* Keep the order TW_Valid, TW_Zero, TW_Denormal */
  48. #define TW_Valid    Const(0)    /* valid */
  49. #define TW_Zero        Const(1)    /* zero */
  50. /* The following fold to 2 (Special) in the Tag Word */
  51. /* #define TW_Denormal     Const(4) */       /* De-normal */
  52. #define TW_Infinity    Const(5)    /* + or - infinity */
  53. #define    TW_NaN        Const(6)    /* Not a Number */
  54.  
  55. #define TW_Empty    Const(7)    /* empty */
  56.  
  57.  
  58. #ifndef __ASSEMBLER__
  59.  
  60. #include <linux/math_emu.h>
  61. #include <linux/linkage.h>
  62.  
  63. #ifdef PARANOID
  64. extern char emulating;
  65. #  define RE_ENTRANT_CHECK_OFF emulating = 0
  66. #  define RE_ENTRANT_CHECK_ON emulating = 1
  67. #else
  68. #  define RE_ENTRANT_CHECK_OFF
  69. #  define RE_ENTRANT_CHECK_ON
  70. #endif PARANOID
  71.  
  72. #define FWAIT_OPCODE 0x9b
  73. #define OP_SIZE_PREFIX 0x66
  74. #define ADDR_SIZE_PREFIX 0x67
  75. #define PREFIX_CS 0x2e
  76. #define PREFIX_DS 0x3e
  77. #define PREFIX_ES 0x26
  78. #define PREFIX_SS 0x36
  79. #define PREFIX_FS 0x64
  80. #define PREFIX_GS 0x65
  81. #define PREFIX_REPE 0xf3
  82. #define PREFIX_REPNE 0xf2
  83. #define PREFIX_LOCK 0xf0
  84. #define PREFIX_CS_ 1
  85. #define PREFIX_DS_ 2
  86. #define PREFIX_ES_ 3
  87. #define PREFIX_FS_ 4
  88. #define PREFIX_GS_ 5
  89. #define PREFIX_SS_ 6
  90.  
  91. /* These are to defeat the default action, giving the instruction
  92.    no net effect: */
  93. #define NO_NET_DATA_EFFECT \
  94.       { FPU_data_address = (void *)data_operand_offset; \
  95.     FPU_data_selector = operand_selector; }
  96. #define NO_NET_INSTR_EFFECT \
  97.       { FPU_entry_eip = ip_offset; \
  98.     FPU_entry_op_cs = cs_selector; }
  99.  
  100.  
  101. typedef void (*FUNC)(void);
  102. typedef struct fpu_reg FPU_REG;
  103. typedef struct { unsigned char address_size, operand_size, segment; }
  104.         overrides;
  105. /* This structure is 32 bits: */
  106. typedef struct { overrides override;
  107.          unsigned char vm86; } fpu_addr_modes;
  108.  
  109. #define    st(x)    ( regs[((top+x) &7 )] )
  110.  
  111. #define    STACK_OVERFLOW    (st_new_ptr = &st(-1), st_new_ptr->tag != TW_Empty)
  112. #define    NOT_EMPTY(i)    (st(i).tag != TW_Empty)
  113. #define    NOT_EMPTY_0    (FPU_st0_tag ^ TW_Empty)
  114.  
  115. extern unsigned char FPU_rm;
  116.  
  117. extern    char    FPU_st0_tag;
  118. extern    FPU_REG    *FPU_st0_ptr;
  119.  
  120. /* ###### These need to be shifted to somewhere safe. */
  121. /* extern void  *FPU_data_address; has been shifted */
  122. extern unsigned short FPU_data_selector;
  123. extern unsigned long FPU_entry_op_cs;
  124.  
  125. extern  FPU_REG  FPU_loaded_data;
  126.  
  127. #define pop()    { FPU_st0_ptr->tag = TW_Empty; top++; }
  128.  
  129. /* push() does not affect the tags */
  130. #define push()    { top--; FPU_st0_ptr = st_new_ptr; }
  131.  
  132.  
  133. #define reg_move(x, y) { \
  134.          *(short *)&((y)->sign) = *(short *)&((x)->sign); \
  135.          *(long *)&((y)->exp) = *(long *)&((x)->exp); \
  136.          *(long long *)&((y)->sigl) = *(long long *)&((x)->sigl); }
  137.  
  138. #define significand(x) ( ((unsigned long long *)&((x)->sigl))[0] )
  139.  
  140.  
  141. /*----- Prototypes for functions written in assembler -----*/
  142. /* extern void reg_move(FPU_REG *a, FPU_REG *b); */
  143.  
  144. asmlinkage void mul64(unsigned long long const *a, unsigned long long const *b,
  145.               unsigned long long *result);
  146. asmlinkage void poly_div2(unsigned long long *x);
  147. asmlinkage void poly_div4(unsigned long long *x);
  148. asmlinkage void poly_div16(unsigned long long *x);
  149. asmlinkage void polynomial(unsigned accum[], unsigned const x[],
  150.                unsigned short const terms[][4], int const n);
  151. asmlinkage void normalize(FPU_REG *x);
  152. asmlinkage void normalize_nuo(FPU_REG *x);
  153. asmlinkage int reg_div(FPU_REG const *arg1, FPU_REG const *arg2,
  154.                FPU_REG *answ, unsigned int control_w);
  155. asmlinkage int reg_u_sub(FPU_REG const *arg1, FPU_REG const *arg2,
  156.              FPU_REG *answ, unsigned int control_w);
  157. asmlinkage int reg_u_mul(FPU_REG const *arg1, FPU_REG const *arg2,
  158.              FPU_REG *answ, unsigned int control_w);
  159. asmlinkage int reg_u_div(FPU_REG const *arg1, FPU_REG const *arg2,
  160.              FPU_REG *answ, unsigned int control_w);
  161. asmlinkage int reg_u_add(FPU_REG const *arg1, FPU_REG const *arg2,
  162.              FPU_REG *answ, unsigned int control_w);
  163. asmlinkage int wm_sqrt(FPU_REG *n, unsigned int control_w);
  164. asmlinkage unsigned    shrx(void *l, unsigned x);
  165. asmlinkage unsigned    shrxs(void *v, unsigned x);
  166. asmlinkage unsigned long div_small(unsigned long long *x, unsigned long y);
  167. asmlinkage void round_reg(FPU_REG *arg, unsigned int extent,
  168.               unsigned int control_w);
  169.  
  170. #ifndef MAKING_PROTO
  171. #include "fpu_proto.h"
  172. #endif
  173.  
  174. #endif __ASSEMBLER__
  175.  
  176. #endif _FPU_EMU_H_
  177.